/**
 * @param {number[]} cards
 * @return {boolean}
 */
var judgePoint24 = function (cards) {
  // 递归函数，判断当前数字数组能否通过运算得到24
  const helper = (nums) => {
    // 当只剩一个数字时，检查是否接近24（考虑浮点数精度）
    if (nums.length === 1) {
      return Math.abs(nums[0] - 24) < 1e-6;
    }

    const n = nums.length;
    // 尝试所有可能的两个数字组合
    for (let i = 0; i < n; i++) {
      for (let j = 0; j < n; j++) {
        if (i === j) continue; // 跳过同一个数字

        const a = nums[i];
        const b = nums[j];

        // 生成排除i和j之后的新数组，并加入运算结果
        const newNums = [];
        for (let k = 0; k < n; k++) {
          if (k !== i && k !== j) {
            newNums.push(nums[k]);
          }
        }

        // 加法
        if (helper([...newNums, a + b])) return true;

        // 减法 a - b
        if (helper([...newNums, a - b])) return true;

        // 减法 b - a
        if (helper([...newNums, b - a])) return true;

        // 乘法
        if (helper([...newNums, a * b])) return true;

        // 除法 a / b（确保除数不为0）
        if (Math.abs(b) > 1e-6) {
          if (helper([...newNums, a / b])) return true;
        }

        // 除法 b / a（确保除数不为0）
        if (Math.abs(a) > 1e-6) {
          if (helper([...newNums, b / a])) return true;
        }
      }
    }

    // 所有可能组合都尝试过，无法得到24
    return false;
  };

  return helper(cards);
};
